package dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import com.sun.corba.se.spi.orbutil.fsm.Guard.Result;

import modelo.Usuario;
import modelo.Comentario;
import modeloRanking.UsuarioRanking;
import conexao.ConnectionFactory;

public class UsuarioDao {
	private Connection conexao;

	public UsuarioDao() throws ClassNotFoundException {
		this.conexao = new ConnectionFactory().getConnection();
	}

	// adicionar:
	public boolean adicionar(Usuario usuario) {

		boolean foiCadastrado = false;

		String sql = "insert into usuario" + "(nome, email, senha)"
				+ "values(?,?,?)";

		try {

			PreparedStatement stmt = conexao.prepareStatement(sql);

			stmt.setString(1, usuario.getNome());
			stmt.setString(2, usuario.getEmail());
			stmt.setString(3, usuario.getSenha());

			stmt.execute();
			stmt.close();

			System.out.println("gravado!");
			foiCadastrado = true;
			conexao.close();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return foiCadastrado;

	}

	// listar todos os usuarios
	public List<Usuario> getList() {

		String consulta = "select * from usuario";
		PreparedStatement pst;
		List<Usuario> usuarios = new ArrayList<Usuario>();

		try {
			pst = this.conexao.prepareStatement(consulta);
			ResultSet result = pst.executeQuery();

			while (result.next()) {
				// cria o objeto usuario
				Usuario usuario = new Usuario();
				usuario.setNome(result.getString("nome"));
				usuario.setEmail(result.getString("email"));
				usuario.setSenha(result.getString("senha"));

				// inserindo contato na lista
				usuarios.add(usuario);
			}
			result.close();
			pst.close();
			return usuarios;

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return usuarios;
	}
	public int getUsuario(String email){
		String consulta = "select * from usuario where email="+"'"+email+"'";
		PreparedStatement pst;
		int codigo = 0;
		try{
			pst = this.conexao.prepareStatement(consulta);
			ResultSet resultSet = pst.executeQuery();
			
			while(resultSet.next()){
				codigo = resultSet.getInt("id");
			}
			resultSet.close();
			pst.close();
			return codigo;
		 } catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return codigo;
	}
		
	// alterar
	public void alterar(Usuario usuario) {

		String sql = "UPDATE usuario SET email= ?, senha=? WHERE nome=?";
		PreparedStatement pst;

		try {
			pst = conexao.prepareStatement(sql);

			pst.setString(1, usuario.getEmail());
			pst.setString(2, usuario.getSenha());
			pst.setString(3, usuario.getNome());

			pst.execute();
			pst.close();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	// remover
	public void remover(Usuario usuario) {

		try {
			PreparedStatement pst = conexao.prepareStatement("delete from usuario where nome=?");
			pst.setString(1, usuario.getNome());
			pst.execute();
			pst.close();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	// ranking de usuário
	public List<UsuarioRanking> rankiarUsuario(){
		List<UsuarioRanking> usuarios = new ArrayList<UsuarioRanking>();
		String consulta = "select distinct codusuario, nome, count(codusuario) as soma from (usuariolivro join usuario on codusuario=id) group by codusuario, nome order by soma DESC ";
		PreparedStatement pst;

		try{
			pst = this.conexao.prepareStatement(consulta);
			ResultSet resultSet = pst.executeQuery();
			
			while(resultSet.next()){

				UsuarioRanking usuario = new UsuarioRanking();
				usuario.setCodigo(resultSet.getInt("codusuario"));
				usuario.setNome(resultSet.getString("nome"));
				usuario.setNumeroLivrosLidos(resultSet.getInt("soma"));
				usuarios.add(usuario);
			}
			resultSet.close();
			pst.close();
			return usuarios;
		 } catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return usuarios;
	}	

	
	public List<Comentario> rankiarUsuarioComentario(){
		List<Comentario> comentarios = new ArrayList<Comentario>();
		String consulta = "select distinct usuario.nome, count(codlivro) as soma from (usuario join comentario on usuario.id=comentario.codusuario) group by codusuario, nome order by soma DESC";
		PreparedStatement pst;

		try{
			pst = this.conexao.prepareStatement(consulta);
			ResultSet resultSet = pst.executeQuery();
			
			while(resultSet.next()){

				Comentario comentarioRanking = new Comentario();
				comentarioRanking.setNomeLeitor(resultSet.getString("nome"));
				comentarioRanking.setNumeroComentario(resultSet.getInt("soma"));
				
				comentarios.add(comentarioRanking);			
			}
			resultSet.close();
			pst.close();
			return comentarios;
		 } catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return comentarios;
	}	
}
